# coding=utf-8

import string
import random, re

from web.utils import re_compile
from pyDes import *

import settings

__all__ = (
	'randstr', 'is_email', 'md5', 'cmp_i',
	'encrypt', 'decrypt', 'format_absurl',
)

# TODO: 将给定相对路径转换为绝对路经
def format_absurl(url):
    '将给定相对路径转换为绝对路径'
    return 'http://%s%s' % (settings.CONFIG.DOMAIN, url)

# TODO: 判断给定文件是否是有效的图片文件
def is_image(f):
    if not f:
        return False

    # 需要PIL包支持
    import Image
    try:
        im = Image.open(f)
        # 如果是有效得图片文件
        # 判断是否是允许得图片类型
        #return im.format in exts
        return im
    except:
        return False

# TODO: 判断给定字符串是否是数字
def is_unsign_integer(src):
    if src:
        for char in str:
            if char not in string.digits:
                return False
        return True
    else:
        return False

# 随机字符串选取范围
_seeks = string.letters + '0123456789'
# TODO: 获取指定长度的随机字符串
def randstr(len = 10):
	return ''.join(random.choice(_seeks) for i in xrange(len))

html_tags_pattern = ['<script[^>]*?>.*?</script>'
                    , '<[\/\!]*?[^<>]*?>'
                    #, '([\r\n])[\s]+'
                    , '&(quot|#34);'
                    , '&(amp|#38);'
                    , '&(lt|#60);'
                    , '&(gt|#62);'
                    , '&(nbsp|#160);']
def html_clear(src):
    '清除给定字符串中的HTML代码'
    if src:
        for pattern in html_tags_pattern:
            p = re_compile(pattern, re.IGNORECASE)
            src = p.sub('', src)
    return src

# TODO: 判断制定字符串是否是正确的Email地址格式
def is_email(str):
	p = re_compile('^([a-z0-9_\.\-\+]+)@([\da-z\.\-]+)\.([a-z\.]{2,6})$', re.IGNORECASE)
	return p.match(str)

# TODO: md5加密给定字符串
def md5(src):
	if src:
		import hashlib
		m = hashlib.md5(src)
		return m.hexdigest()

	return None

# TODO: 忽略大小写比较两个字符串是否相等
def cmp_i(lhs, rhs):
	return cmp(lhs.lower(), rhs.lower())

# TODO: 获取des对象
def _des():
	return des('DESCRYPT', CBC, '\5\2\3\6\5\6\7\2', pad=None, padmode=PAD_PKCS5)

# TODO: 加密给定字符串
def encrypt(src):
	return src and _des().encrypt(src.encode('utf-8')) or None

# TODO: 解密给定字符串
def decrypt(src):
	try:
		return src and _des().decrypt(src).decode('utf-8') or None
	except:
		return None
